import java.util.Vector;

public class RubricaContatti {
	private String nomeR;
	protected Vector<Contatto> rubrica = new Vector<Contatto>();
	private int THIS_DIM;
	
	public class Contatto {
		 String nome;
		 String cognome;
		 String telefono;
		 String note;

		public Contatto(String nome, String cognome, String telefono,
				String note) throws FormatException{
			if(!(nome.matches("[a-aZ-Z]*")))throw (new FormatException("nome errato"));
			if(!(cognome.matches("[a-aZ-Z]*")))throw (new FormatException("cognome errato"));
			if(!(telefono.matches("(\\d)+")))throw (new FormatException("telefono errato"));
			this.nome = nome;
			this.cognome = cognome;
			this.telefono = telefono;
			this.note = note;
		}
		
		public Contatto() {
		}
		
		public boolean equals(Object cont) {
			if (!(cont instanceof Contatto))
				return false;
			Contatto cont1 = (Contatto) cont;
			return (nome.equals(cont1.nome) && cognome.equals(cont1.cognome) && telefono
					.equals(cont1.telefono));
		}
		
		public String toString(){
			return ("nome:"+nome+";"+"cognome:"+cognome+";"+"telefono:"+telefono+";");
		}
	}

	public RubricaContatti(String nomeR, int dim) {
		this.nomeR = nomeR;
		THIS_DIM = dim;
	}
	
	public RubricaContatti() {
	}

	
	public boolean aggiungi(String cognome, String nome, String telefono,
			String note) throws FormatException {
		if (rubrica.size() < THIS_DIM) {
			Contatto cont = new Contatto(nome,cognome,telefono,note);
			if (!(rubrica.contains(cont))) {
				rubrica.add(cont);
				return true;
			}
			else  return false;
		} else return false;		
	}

	public Vector<Contatto> cerca(String cognome,String nome) {
		Vector<Contatto> trovati = new Vector<Contatto>();
		for (Contatto cont : rubrica) {
			if (cont.nome.toLowerCase().startsWith(nome.toLowerCase()) &&
					cont.cognome.toLowerCase().startsWith(cognome.toLowerCase()) ) {
				trovati.add(cont);
			}
		}
		return trovati;
	}
	
	public Vector<Contatto> cercaCaseSensitive(String cognome,String nome) {
		Vector<Contatto> trovati = new Vector<Contatto>();
		for (Contatto cont : rubrica) {
			if (cont.nome.startsWith(nome) &&
					cont.cognome.startsWith(cognome) ) {
				trovati.add(cont);
			}
		}
		return trovati;
	}
	
	
	public void rimuovi(Vector<Contatto> conts) {
		for (Contatto cont : conts) {
			rubrica.remove(cont);
		}
	}

	public String getNome() {
		return nomeR;
	}

	public int getMaxDim() {
		return THIS_DIM;
	}

	public int getDim() {
		return rubrica.size();
	}

	public String toString() {
		String st = "";
		for (Contatto cont : rubrica) {
			st = st + "\n" + cont;
		}
		return st;
	}


}
